package clientermi.controlador;

import clientermi.favoritoRMI.Favorito;
import clientermi.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 * Calse de tipo controlador que permite manipular la información de los objetos
 * Favorito que serán finalmente insertados en la base de datos
 * @author Jorge Hernán Londoño Echeverri narzyx@gmail.com Hayner Benavides Moreno hayner2005@gmail.com
 */
public class FavoritosControlador {
    private Connection conn;
	private Statement stm;

    public FavoritosControlador(){
        conn=null;
        stm=null;
    }

    public Boolean esSentenciaNula(){
		if(stm==null)
			return true;
		return false;
	}

	public Boolean esConexionNula(){
		if(conn==null){
			return true;
		}
		return false;
	}
    /**
     * Método que inicaliza la conexión al a base de datos
     * @param motor
     * @return boolean true conrrecta inicalización, false en caso contrario
     */
    public boolean init(String motor){
        String cadena=encontrarDriver("sqlite");
		if(!cadena.equals("sqlite")){
			conectar(cadena);
			if(!esConexionNula())	{
				crearSentencia();
                if(!esSentenciaNula())
                    return true;
			}
		}

        return false;
    }
    /**
     * Método que implementa la conxión del driver para
     * SQLITE
     * @param motor
     * @return String
     */
	public String encontrarDriver(String motor){

			String cadenaConexion="";
			try{
				if(motor.equals("sqlite")){
					Class.forName("org.sqlite.JDBC");
					cadenaConexion="jdbc:sqlite:bd_asd/favoritos_db.sqlite";
				}
			}
			catch(ClassNotFoundException cnfe){
				System.out.println("No se ha encontrado el driver JDBC de "+motor+" "+cnfe.getMessage());

			}
			return cadenaConexion;
	}
    /**
     * Método que establece la conexión por medio del driver establcido
     * @param cadena
     */
	public void conectar(String cadena){
		this.conn=null;
		try{

			this.conn = DriverManager.getConnection(cadena);
		}
		catch(SQLException sqle){
			System.out.println("No se pudo realizar la conexion: "+sqle.getMessage());
		}
	}
    /**
     * método que crea la sentecia a ejecutar en la base de datos
     */
	public void crearSentencia(){
		stm = null;
		try{
            stm = conn.createStatement();
		}
		catch(SQLException sqle){
			System.out.println("No se logro crear la sentencia");
		}
	}
    /**
     * Método que inserta un favorito
     * @param favorito
     */
	public void insertarFavorito(Favorito favorito){

			String sql = "INSERT INTO favoritos VALUES((select max(id) from favoritos)+1, '" +
			favorito.getNombre() + "', '" + favorito.getDescripcion() +
			"', '" + favorito.getUrl() + "')";
			try
			{
			// Retorna un valor entero que indica el número de
			int control = stm.executeUpdate(sql);
			//System.out.println("Ejecutando ... " + sql +" ... " + control);
			}
			catch(SQLException e4)
			{
				System.out.println("Error ejecutando \"" + sql +"\": " + e4.getMessage());
			}
	}
    /**
     * Método que actualiza un registro de favorito
     * @param favorito
     */
    public void actualizarFavorito(Favorito favorito){
            String sql = "UPDATE favoritos SET nombre='" + favorito.getNombre() +
            "', url='" + favorito.getUrl() +
			"', descripcion=" + favorito.getDescripcion() + " where id='"+favorito.getId()+"'";
			try
			{
			// Retorna un valor entero que indica el número de
			int control = stm.executeUpdate(sql);
			//System.out.println("Ejecutando ... " + sql +" ... " + control);
			}
			catch(SQLException e4)
			{
				System.out.println("Error ejecutando \"" + sql +"\": " + e4.getMessage());
			}
    }
    /**
     * Método que elimina un favorito, por medio de su id
     * @param id
     */
	public void eliminarFavorito(int id){
		String sql3 = "DELETE FROM favoritos WHERE id ='"+id+"'";
		try
		{
			int control = stm.executeUpdate(sql3);
			//System.out.println("Ejecutando ... " + sql3 +" ... " + control);
		}
		catch(SQLException e6)
		{
			System.out.println("Error ejecutando \"" + sql3 + "\": " + e6.getMessage());
		}
	}
    /**
     * Método que elimina todos los registros de favoritos
     */
    public void eliminarRegistro(){
		String sql3 = "DELETE FROM favoritos ";
		try
		{
			int control = stm.executeUpdate(sql3);
			//System.out.println("Ejecutando ... " + sql3 + " ... " + control);
		}
		catch(SQLException e6)
		{
			System.out.println("Error ejecutando \"" + sql3 + "\": " + e6.getMessage());
		}
	}
    /**
     * Método que permite verificar sí existe un favorito o no
     * por medio de su id
     * @param indice
     * @return boolean true sí existe, false en caso contrario
     */
    public boolean isFavorito(String indice){
        ResultSet rs = null;
		String sql = "SELECT count(id) as total FROM favoritos WHERE id='"+indice+"' GROUP BY id";
		try
		{
			// Retorna un objeto ResultSet con la confirmación de
			// la existencia de un registro identificado con el valor del parametro indice
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                if(rs.getInt("total")>0){
                    rs.close();
                    return true;
                }
                else{
                    rs.close();
                    return false;
                }				
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +	e7.getMessage());
		}

        return false;
    }
    /**
     * Método que obtiene una lista de favoritos de la base de datos sin reestricción
     * @return ArrayList<Favorito>
     */
	public ArrayList<Favorito> buscar(){
		ResultSet rs = null;
        ArrayList<Favorito> lista = new ArrayList<Favorito>();
		String sql = "SELECT * FROM favoritos ORDER BY id ASC";
		try
		{
			// Retorna un objeto ResultSet con la información del
			// conjunto de tuplas resultado de la consulta recién
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                Favorito favorito = new Favorito();
                favorito.setNombre(rs.getString("nombre"));
                favorito.setUrl(rs.getString("url"));
                favorito.setDescripcion(rs.getString("descripcion"));
                favorito.setId(rs.getInt("id"));

                lista.add(favorito);				
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " + e7.getMessage());
		}

        return lista;
	}
    /**
     * Método que obtiene una lista de favoritos exceto el que se desee
     * por medio de su id
     * @param indice
     * @return ArrayList<Favorito> lista de favoritos
     */
    public ArrayList<Favorito> buscarExcepto(String indice){
		ResultSet rs = null;
        ArrayList<Favorito> lista = new ArrayList<Favorito>();
		String sql = "SELECT * FROM favoritos WHERE id <> '"+indice+"' ORDER BY id ASC";
		try
		{
			// Retorna un objeto ResultSet con la información del
			// conjunto de tuplas resultado de la consulta recién
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                Favorito favorito = new Favorito();
                favorito.setNombre(rs.getString("nombre"));
                favorito.setUrl(rs.getString("url"));
                favorito.setDescripcion(rs.getString("descripcion"));
                favorito.setId(rs.getInt("id"));

                lista.add(favorito);
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +
			e7.getMessage());
		}

        return lista;
	}
    /**
     * Método que obtiene una lista de favoritos por medio de
     * uncriterio, ya sea por descripción o por nombre
     * @param criterio
     * @return ArrayList<Favorito>
     */
    public ArrayList<Favorito> buscar(String criterio){
		ResultSet rs = null;
        ArrayList<Favorito> lista = new ArrayList<Favorito>();
		String sql = "SELECT * FROM favoritos WHERE nombre LIKE '%"+criterio+"%' or descripcion LIKE '%"+criterio+"%' ORDER BY id ASC";
		try
		{
			// Retorna un objeto ResultSet con la información del
			// conjunto de tuplas resultado de la consulta recién
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                Favorito favorito = new Favorito();
                favorito.setNombre(rs.getString("nombre"));
                favorito.setUrl(rs.getString("url"));
                favorito.setDescripcion(rs.getString("descripcion"));
                favorito.setId(rs.getInt("id"));

                lista.add(favorito);
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +
			e7.getMessage());
		}

        return lista;
	}
    /**
     * Método que cierra la conexión a la base de datos
     */
	public void cerrar(){
		try
		{
			conn.close();
		}
		catch(SQLException e8)
		{
			System.out.println("Error cerrando la conexion: " +
			e8.getMessage());
		}
	}



}
